const http = require('http')
const fs = require('fs')

var server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' })
  res.end(fs.readFileSync('./111.html')) // 返回页面readFileSync--返回文件
})
// socket	// nodejs-websocket
const Server = require('ws').Server

// 建立好了服务端
var wss = new Server({ server }) //

// 存放前端连接的socket
var clientMap = {} // 每个连接
var count = 0 // 代表连接人数
var id = 0 // 连接人id
// 当客户端连接上的就会触发，回调会接收一个socket对象
wss.on('connection', function (socket) {
  count++
  id++
  socket.id = id
  clientMap[socket.id] = socket
  socket.nickname = '好友'
  console.log(`现在有${count}人连接了`)
  broadClients(socket.nickname, 1) // 返回给连接用户  客户列表

  // 当这个客户端发送数据的时候会触发
  socket.on('message', function (msg) {
    // msg---->前端传来信息 msg.nickname--昵称   msg.msg--当条信息
    // console.log(`客户端${socket.id} 说：${msg}`)

    let info = JSON.parse(msg)
    if (socket.nickname !== info.nickname) {
      // socket.nickname
      socket.nickname = info.nickname // 替换昵称
      broadClients() // 更新客户列表
    }
    socket.nickname = info.nickname
    broadcast(socket, info.msg) // 把信息发送给各个客户端
  })

  // 当客户端断开的时候触发
  socket.on('close', function () {
    // console.log(`客户端${socket.id} 说：${msg}`)
    count--
    let nickname = socket.nickname // 收集断开的昵称
    delete clientMap[socket.id] // 从客户端列表种中删除

    broadClients(nickname, 2) // 从新返回客户列表
  })

  // 当客户端连接出错的时候
  socket.on('error', function (err) {
    console.log(err)
  })
})

// 广播函数，像所有的客户端发送某一个客户端说的话
function broadcast (socket, msg) {
  //    		昵称                      消息      类型:msg
  let info = { nickname: socket.nickname, msg: msg, type: 'msg' }
  for (var id in clientMap) {
    // clientMap 循环每个客户端 返回数据
    ;(info.isMe = socket.id == id ? 'true' : false), // 判断自己的数据
      clientMap[id].send(JSON.stringify(info)) // 返回数据
  }
}
// 返回客户端信息---------用户列表
function broadClients (nickname, type) {
  let clients = [] // 昵称数组
  for (var id in clientMap) {
    clients.push(clientMap[id].nickname)
  }
  for (var id in clientMap) {
    // clientMap---客户集合
    // 循环客户端 返回数据
    clientMap[id].send(
      JSON.stringify({
        count: count, // 连接总人数
        clients: clients, // 昵称数组
        type: 'count', // type:"count"
        nickname: nickname, // 昵称
        _type: type // 1---加入群聊  2---离开群聊
      })
    )
  }
}

server.listen(3000, '192.168.139.9')
